package com.wuliu.driver.util;

public class DistanceCalculator {

    // 地球的平均半径（单位：千米）
    private static final double EARTH_RADIUS = 6371.0;

    /**
     * 根据两个经纬度计算两个地点之间的距离（单位：千米）
     *
     * @param lat1 第一个地点的纬度
     * @param lng1 第一个地点的经度
     * @param lat2 第二个地点的纬度
     * @param lng2 第二个地点的经度
     * @return 两个地点之间的距离（单位：千米）
     */
    public static double calculateDistance(double lat1, double lng1, double lat2, double lng2) {
        // 将角度转换为弧度
        double lat1Rad = Math.toRadians(lat1);
        double lng1Rad = Math.toRadians(lng1);
        double lat2Rad = Math.toRadians(lat2);
        double lng2Rad = Math.toRadians(lng2);

        // 纬度和经度的差值
        double deltaLat = lat2Rad - lat1Rad;
        double deltaLng = lng2Rad - lng1Rad;

        // Haversine 公式
        double a = Math.pow(Math.sin(deltaLat / 2), 2)
                + Math.cos(lat1Rad) * Math.cos(lat2Rad)
                * Math.pow(Math.sin(deltaLng / 2), 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        // 计算距离
        double distance = EARTH_RADIUS * c;
        return distance;
    }

    public static void main(String[] args) {
        // 示例：计算两个地点之间的距离
        double lat1 = 39.9042; // 北京市的纬度
        double lng1 = 116.4074; // 北京市的经度
        double lat2 = 31.2304; // 上海市的纬度
        double lng2 = 121.4758; // 上海市的经度

        double distance = calculateDistance(lat1, lng1, lat2, lng2);
        System.out.printf("Distance between the two locations: %.2f km%n", distance);
    }
}
